import java.util.Scanner;

// 线性方程组求解类（复用 9.11 题代码，非公共类）
class LinearEquation {
    private double a;
    private double b;
    private double c;
    private double d;
    private double e;
    private double f;

    public LinearEquation(double a, double b, double c, double d, double e, double f) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        this.f = f;
    }

    public double getA() { return a; }
    public double getB() { return b; }
    public double getC() { return c; }
    public double getD() { return d; }
    public double getE() { return e; }
    public double getF() { return f; }

    // 判断方程组是否有解（ad - bc ≠ 0）
    public boolean isSolvable() {
        return (a * d - b * c) != 0;
    }

    // 计算 x 解
    public double getX() {
        if (!isSolvable()) {
            throw new IllegalStateException("方程组无解");
        }
        return (e * d - b * f) / (a * d - b * c);
    }

    // 计算 y 解
    public double getY() {
        if (!isSolvable()) {
            throw new IllegalStateException("方程组无解");
        }
        return (a * f - e * c) / (a * d - b * c);
    }
}

// 主程序类（公共类，文件名需与类名一致：IntersectingPoint.java）
public class IntersectingPoint {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入四个端点坐标
        System.out.println("请输入两条线段的四个端点坐标（格式：x1 y1 x2 y2 x3 y3 x4 y4）：");
        double x1 = scanner.nextDouble();
        double y1 = scanner.nextDouble();
        double x2 = scanner.nextDouble();
        double y2 = scanner.nextDouble();
        double x3 = scanner.nextDouble();
        double y3 = scanner.nextDouble();
        double x4 = scanner.nextDouble();
        double y4 = scanner.nextDouble();

        // 计算线性方程组的系数（映射为 ax + by = e, cx + dy = f）
        double a = y1 - y2;
        double b = x2 - x1;
        double e = a * x1 + b * y1;
        double c = y3 - y4;
        double d = x4 - x3;
        double f = c * x3 + d * y3;

        // 创建 LinearEquation 对象求解直线交点
        LinearEquation equation = new LinearEquation(a, b, c, d, e, f);

        if (equation.isSolvable()) {
            // 计算直线交点 (x, y)
            double x = equation.getX();
            double y = equation.getY();

            // 验证交点是否同时在两条线段上（考虑浮点数精度，使用 1e-9 容差）
            boolean onSegment1 = isPointOnSegment(x1, y1, x2, y2, x, y);
            boolean onSegment2 = isPointOnSegment(x3, y3, x4, y4, x, y);

            if (onSegment1 && onSegment2) {
                // 交点在两条线段上，输出结果（保留 4 位小数）
                System.out.printf("两条线段的交点为：(%.4f, %.4f)\n", x, y);
            } else {
                // 直线相交但线段不相交
                System.out.println("两条线段不相交。");
            }
        } else {
            // 方程组无解（两条直线平行或重合）
            System.out.println("两条线段平行或重合，无唯一交点。");
        }

        scanner.close();
    }

    /**
     * 辅助方法：判断点 (px, py) 是否在线段 (x1,y1)-(x2,y2) 上
     * @param x1 线段端点1 x坐标
     * @param y1 线段端点1 y坐标
     * @param x2 线段端点2 x坐标
     * @param y2 线段端点2 y坐标
     * @param px 待判断点 x坐标
     * @param py 待判断点 y坐标
     * @return true 表示在 segment 上，false 否则
     */
    private static boolean isPointOnSegment(double x1, double y1, double x2, double y2, double px, double py) {
        double eps = 1e-9; // 浮点数精度容差（避免因计算误差导致误判）
        // 1. 点的坐标在 segment 的 x、y 范围之内（包含端点）
        boolean withinX = (px >= Math.min(x1, x2) - eps) && (px <= Math.max(x1, x2) + eps);
        boolean withinY = (py >= Math.min(y1, y2) - eps) && (py <= Math.max(y1, y2) + eps);
        // 2. 点与 segment 共线（向量叉积为 0，考虑容差）
        boolean collinear = Math.abs((x2 - x1) * (py - y1) - (y2 - y1) * (px - x1)) < eps;
        return withinX && withinY && collinear;
    }
}